# 1. 导入 backtrader 库
import backtrader as bt
import datetime # 用于处理日期
import os # 用于获取当前脚本所在目录
import pandas as pd # 用于读取CSV数据
import matplotlib.pyplot as plt

# 2. 创建 Strategy 子类
# 定义一个策略，它继承自 backtrader.Strategy
class MyFirstStrategy(bt.Strategy):
    # 这个策略非常简单，它只在每个K线上打印收盘价
    def next(self):
        # self.datas[0] 是默认的第一个数据源
        # .close[0] 获取当前K线的收盘价
        print(f'{self.datas[0].datetime.date(0)} --- Close: {self.datas[0].close[0]}')

# 3. 实例化 Cerebro 引擎√
cerebro = bt.Cerebro()

# 4. 加载数据 (Data Feed)
# 获取当前脚本所在目录的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
data_file = os.path.join(current_dir, 'AAPL_1yr_history_2024-08-31_2025-08-31.csv')

# 使用pandas读取CSV数据
df = pd.read_csv(data_file, skiprows=3)  # 跳过前3行标题
# 重命名列以匹配backtrader期望的格式
df.columns = ['Date', 'Close', 'High', 'Low', 'Open', 'Volume']
# 将Date列转换为datetime格式
df['Date'] = pd.to_datetime(df['Date'])
# 设置Date为索引
df.set_index('Date', inplace=True)
print(df)

# 创建PandasData数据源
data = bt.feeds.PandasData(
    dataname=df,
    # 数据起始时间 - 更新为实际数据的时间范围
    fromdate=datetime.datetime(2024, 9, 3),
    # 数据结束时间 - 更新为实际数据的时间范围
    todate=datetime.datetime(2025, 8, 29)
)

# 将数据添加到 Cerebro
cerebro.adddata(data)

# 5. 将策略添加到 Cerebro
cerebro.addstrategy(MyFirstStrategy)

# 6. 设置初始资金
cerebro.broker.setcash(100000.0)
print(f'Starting Portfolio Value: {cerebro.broker.getvalue():.2f}')

# 7. 运行 cerebro.run()
# cerebro.run()

# 8. 打印最终结果 (这里没有交易，所以和初始资金一样)
# print(f'Final Portfolio Value: {cerebro.broker.getvalue():.2f}')

# (可选) 绘制结果
# cerebro.plot()